// app.ts
App<IAppOption>({
  // 咱们小程序全局共享的数据，各个页面都能用到哦！
  globalData: {
    name: "开发者", // 这里可以放个默认的名字，或者你将来从后台获取的用户昵称
    questions: [] // 我们的题库数据就放这里啦，从后台接口拿回来会填充到这
  },

  // 小程序启动时就会执行这里面的代码，只走一次！
  onLaunch() {
    // 哎呀，这是在记录小程序的启动日志呢！
    // 每次启动都会把当前时间戳加进去，方便我们看小程序啥时候被打开过。
    const logs = wx.getStorageSync('logs') || []
    logs.unshift(Date.now())
    wx.setStorageSync('logs', logs)

    // 用户登录：微信会给你一个临时凭证 code
    // 这个 code 咱们得发给后端服务器，让后端去换取用户的 openId、sessionKey、unionId 等敏感信息。
    wx.login({
      success: res => {
        console.log(res.code)
        // TODO: 在这里把 res.code 发送给你的后端服务器进行登录验证和用户数据获取
      },
    })

    // 好啦，这里就是咱们获取题库的请求了，是不是有点像 axios.get 的感觉？
    // 我们会向后端发送一个 GET 请求，拿到题目数据。
    this.request({
      url: 'http://127.0.0.1:8000/api/question/', // 后端url，我已经后端项目打包好，无需修改，只需要后端项目启动服务就能用
      method: 'GET', // 咱们是去拿数据，所以用 GET 方法
      data: { // 这是gpt，查询参数，我后端目前没有查询参数，所以不需要
      },
      header: { // 可以设置一些请求头，比如告诉服务器我们想要 JSON 格式的数据
        'Content-Type': 'application/json'
      }
    })
    // 请求成功了，数据会通过 Promise 的 then() 方法传过来
    // WechatMiniprogram.RequestSuccessCallbackResult 是微信小程序官方给的请求成功返回结果的类型哦，用它来让 TypeScript 知道 res 里有啥。
    .then((res: WechatMiniprogram.RequestSuccessCallbackResult) => {
      // console.log('API请求成功啦:', res.data);
      // 拿到数据后，把它赋值给咱们全局的 questions 题库。
      // as Question[] 是类型断言，它在告诉 TypeScript：我确定 res.data 就是 Question 数组类型，你别担心！
      this.globalData.questions = res.data as Question[];
      console.log('题库数据:', this.globalData.questions) // 用来测试打印是否成功
    })
    // 请求失败了咋办？别担心，Promise 的 catch() 方法会帮你抓住错误！
    .catch((err: any) => {
      console.error('API请求失败了:', err);
      // 给用户一个友好的提示，告诉他们题目没加载成功
      wx.showToast({
        title: '题目加载失败',
        icon: 'error',
        duration: 2000
      });
    });
  },

  /**
   * 封装了微信小程序的 wx.request 方法，让它变成 Promise 形式，用起来更舒服！
   * @param {WechatMiniprogram.RequestOption} options - 这是一个对象，包含了 wx.request 所有可以配置的参数，比如 URL、请求方法、数据等等。
   * @returns {Promise<WechatMiniprogram.RequestSuccessCallbackResult>} - 返回一个 Promise 对象。
   *   如果请求成功，Promise 会 resolve (解决)，并把微信请求的成功结果 (res) 传出来。
   *   如果请求失败，Promise 会 reject (拒绝)，并把错误信息 (err) 传出来。
   */
  /*
  小知识：
  - `WechatMiniprogram.RequestOption` 是微信小程序官方为 `wx.request` 函数的参数定义的类型。
  - `WechatMiniprogram.RequestSuccessCallbackResult` 是微信小程序官方为 `wx.request` 成功回调的返回结果定义的类型。
  这些类型声明都在 `typings/types/wx/index.d.ts` 这些声明文件里躺着呢，方便咱们 TypeScript 检查！
  */
  request(options: WechatMiniprogram.RequestOption): Promise<WechatMiniprogram.RequestSuccessCallbackResult> {
    return new Promise((resolve, reject) => {
      wx.request({
        url: options.url, // 请求的目标 URL 地址
        method: options.method || 'GET', // 请求方式，没传就默认是 GET
        data: options.data || {}, // 要发送到服务器的数据
        header: options.header || { // 请求头信息，比如数据的格式
          'content-type': 'application/json'
        },
        success(res) { // 服务器成功响应了，这个回调就会执行
          // 检查 HTTP 状态码，2xx 表示请求成功了
          if (res.statusCode >= 200 && res.statusCode < 300) {
            resolve(res); // 状态码正常，把结果传给 Promise 的 then()
          } else {
            // 如果状态码不是 2xx，咱们就把它当成业务上的错误，通过 reject 传递出去
            reject(res);
          }
        },
        fail(err) { // 请求出错了，比如网络不通、域名解析失败等等
          // 有网络问题或请求发不出去，就直接把错误通过 reject 传递出去
          reject(err);
        },
        complete() {
          // 无论请求成功还是失败，这个回调都会执行，可以在这里做一些收尾工作，比如关闭加载提示
        }
      });
    });
  }
})